home *** CD-ROM | disk | FTP | other *** search
- class RoundButtonFilter extends ButtonFilter {
- int Xcenter;
- int Ycenter;
- int Yradsq;
- int innerW;
- int innerH;
- int Yrad2sq;
- private int[] savedranges;
- private int savedy;
-
- public RoundButtonFilter(boolean press, int p, int b, int w, int h) {
- super(press, p, b, w, h);
- this.Xcenter = w / 2;
- this.Ycenter = h / 2;
- this.Yradsq = h * h / 4;
- this.innerW = w - super.border * 2;
- this.innerH = h - super.border * 2;
- this.Yrad2sq = this.innerH * this.innerH / 4;
- }
-
- public void buttonRanges(int y, int[] ranges) {
- int yrel = Math.abs(this.Ycenter - y);
- int xrel = (int)(Math.sqrt((double)(this.Yradsq - yrel * yrel)) * (double)super.width / (double)super.height);
- ranges[0] = 0;
- ranges[1] = this.Xcenter - xrel;
- ranges[6] = this.Xcenter + xrel;
- ranges[7] = super.width;
- if (y < super.border) {
- ranges[2] = ranges[3] = ranges[4] = this.Xcenter;
- ranges[5] = ranges[6];
- } else if (y + super.border >= super.height) {
- ranges[2] = ranges[1];
- ranges[3] = ranges[4] = ranges[5] = this.Xcenter;
- } else {
- int xrel2 = (int)(Math.sqrt((double)(this.Yrad2sq - yrel * yrel)) * (double)this.innerW / (double)this.innerH);
- ranges[3] = this.Xcenter - xrel2;
- ranges[4] = this.Xcenter + xrel2;
- if (y < this.Ycenter) {
- ranges[2] = ranges[3];
- ranges[5] = ranges[6];
- } else {
- ranges[2] = ranges[1];
- ranges[5] = ranges[4];
- }
- }
- }
-
- private synchronized int[] getRanges(int y) {
- if (this.savedranges == null || this.savedy != y) {
- if (this.savedranges == null) {
- this.savedranges = new int[8];
- }
-
- this.buttonRanges(y, this.savedranges);
- this.savedy = y;
- }
-
- return this.savedranges;
- }
-
- public int filterRGB(int x, int y, int rgb) {
- int[] ranges = this.getRanges(y);
-
- int i;
- for(i = 0; i < 7 && (x < ranges[i] || x >= ranges[i + 1]); ++i) {
- }
-
- boolean brighter;
- int percent;
- switch (i) {
- case 0:
- case 6:
- default:
- return rgb & 16777215;
- case 1:
- brighter = !super.pressed;
- percent = super.defpercent;
- break;
- case 2:
- double angle = Math.atan2((double)(y - this.Ycenter), (double)(this.Xcenter - x));
- percent = super.defpercent - (int)(Math.cos(angle) * (double)2.0F * (double)super.defpercent);
- if (!super.pressed) {
- percent = -percent;
- }
-
- if (percent == 0) {
- return rgb;
- }
-
- if (percent < 0) {
- percent = -percent;
- brighter = false;
- } else {
- brighter = true;
- }
- break;
- case 3:
- if (!super.pressed) {
- return rgb & 16777215;
- }
-
- brighter = false;
- percent = super.defpercent;
- break;
- case 4:
- double angle = Math.atan2((double)(this.Ycenter - y), (double)(x - this.Xcenter));
- percent = super.defpercent - (int)(Math.cos(angle) * (double)2.0F * (double)super.defpercent);
- if (super.pressed) {
- percent = -percent;
- }
-
- if (percent == 0) {
- return rgb;
- }
-
- if (percent < 0) {
- percent = -percent;
- brighter = false;
- } else {
- brighter = true;
- }
- break;
- case 5:
- brighter = super.pressed;
- percent = super.defpercent;
- }
-
- return ((ButtonFilter)this).filterRGB(rgb, brighter, percent);
- }
- }
-